home *** CD-ROM | disk | FTP | other *** search
-
-
-
- /************************************
- * Inclusions
- ************************************/
-
- #include <QuickDraw.h>
- #include <Memory.h>
- #include <Resources.h>
- #include <OSUtils.h>
- #include <OSUtils.h>
- #include <OSUtils.h>
- #include <Events.h>
-
- #define privateEasyControls
- #include "BigEasy2.h"
- #include "BigEasyGrafish.h"
- #include "BigEasyTextish.h"
- #include "BigEasyControls.h"
- #include "Instrument Editor Controls.h"
-
-
- /************************************
- * Constants
- ************************************/
-
- #define kSlop 10
- #define kBarVMargin 4
- #define kSliderCursor 200
-
- /************************************
- Default Styles
- ************************************/
-
- static tSliderStyle dDefaultSliderStyle =
- {
- longNum,
- 120,15,
- 80,13,
- nil
- };
-
-
- /************************************
- * Prototypes
- ************************************/
- static void MaybeRaisedRect(short c,Rect *r,Boolean b);
-
- static void NewSlider(easyControlPtr ec);
- static void DisposeSlider(easyControlPtr ec);
- static void DrawSlider(easyControlPtr );
- static void TrackSlider(easyControlPtr,Point p);
- static void KeySlider(easyControlPtr,short k,short m,Boolean *tookKey);
- static void DrawSliderValue(easyControlPtr );
- static void HitTestSlider(void);
- static void SetSliderValue(struct easyControlRecord *ec,long value);
-
-
- static void NewBoolean(easyControlPtr ec);
- static void DisposeBoolean(easyControlPtr ec);
- static void DrawBoolean(easyControlPtr );
- static void TrackBoolean(easyControlPtr,Point p);
- static void KeyBoolean(easyControlPtr,short k,short m,Boolean *tookKey);
- static void DrawBooleanValue(easyControlPtr );
- static void HitTestBoolean(void);
- static void SetBooleanValue(struct easyControlRecord *ec,long value);
-
-
- static void NewToggle(easyControlPtr ec);
- static void DisposeToggle(easyControlPtr ec);
- static void DrawToggle(easyControlPtr );
- static void DrawToggleValue(easyControlPtr );
- static void HitTestToggle(easyControlPtr,Point p);
- static void TrackToggle(easyControlPtr,Point p,short *trackResult,short mods);
- static void KeyToggle(easyControlPtr,short k,short mods,Boolean *tookKey);
- static void SetToggleValue(easyControlPtr,long);
- static void Idle(easyControlPtr,long *);
-
- easyControlType toggleType =
- {
- NewToggle,
- DisposeToggle,
- DrawToggle,
- HitTestToggle,
- TrackToggle,
- KeyToggle,
- SetToggleValue,
- Idle,
- DrawToggleValue
- };
-
- easyControlType sliderType =
- {
- NewSlider,
- DisposeSlider,
- DrawSlider,
- (becHitTestProcPtr)HitTestSlider,
- (becTrackProcPtr)TrackSlider,
- KeySlider,
- SetSliderValue,
- Idle,
- DrawSliderValue
- };
-
- easyControlType booleanType =
- {
- NewBoolean,
- DisposeBoolean,
- DrawBoolean,
- (becHitTestProcPtr)HitTestBoolean,
- (becTrackProcPtr)TrackBoolean,
- KeyBoolean,
- SetBooleanValue,
- Idle,
- DrawBooleanValue
- };
-
-
-
-
-
- /************************************
- * Routines
- ************************************/
-
- void MaybeRaisedRect(short c,Rect *r,Boolean b)
- /*
- * if background, draw a flat rect,
- * else a raised rect.
- */
- {
- if(b)
- {
- Fore555(c);
- PaintRect(r);
- }
- else
- RaisedRect(r,c);
- }
-
-
-
- /*
- * Sliders
- *
- * Sliders copy their style into a handle, stored
- * in the slide field of the easyControl.
- */
-
- void TrackSlider(easyControlPtr ec,Point p)
- /*
- * Track the mouse within the slider as long
- * as the button is held down, all the while
- * updating the value and drawing the bar.
- */
- {
- tSliderStyle *st;
- Point lastP;
- long oldValue;
- long value;
- long vRange, rRange,rounding;
- double fVRange, fRRange, fRounding; /* for floating point sliders */
- Rect slopRect;
- long q;
- Boolean zingCursor;
- Handle tempH;
-
- GoCursor(kSliderCursor);
- zingCursor = true;
-
- st = *(tSliderStyle **)ec->style;
- HLock(tempH = RecoverHandle((Ptr)st));
- oldValue = ec->value;
-
- slopRect = ec->rect;
- InsetRect(&slopRect,-kSlop,-kSlop);
-
- if(st->numberType == floatNum)
- {
- fVRange = AsFloat(ec->high) - AsFloat(ec->low);
- fRRange = st->sWidth - 2;
- fRounding = (fRRange / fVRange) / 2;
- }
- else
- {
- vRange = ec->high - ec->low;
- rRange = st->sWidth - 2;
- rounding = (rRange / vRange) / 2;
- }
-
- if(ec->initActionProc) /* Call initAction proc once */
- (*ec->initActionProc)(ec->value,ec->refcon);
- while(Button())
- {
- q = TickCount()+2;
- while(TickCount() < q)
- SystemTask();
-
-
- if(ec->actionProc) /* Call action proc every time */
- (*ec->actionProc)(ec->value,ec->refcon);
-
- lastP.h = p.h+1; /* Guarantee do first time through */
- GetMouse(&p);
- if( (p.h != lastP.h) || (p.v != lastP.v) )
- {
- if(PtInRect(p,&slopRect))
- {
- if(!zingCursor)
- {
- GoCursor(kSliderCursor);
- zingCursor = true;
- }
- if(st->numberType == floatNum)
- ;
- else
- value = ec->low + (long)(p.h - ec->rect.left + rounding + 1) * vRange/rRange;
- }
- else
- {
- value = oldValue;
- if(zingCursor)
- {
- InitCursor();
- zingCursor = false;
- }
- }
-
- if(value < ec->low)
- value = ec->low;
- else if(value > ec->high)
- value = ec->high;
-
- if(value != ec->value)
- {
- ec->value = value;
- DrawSliderValue(ec);
-
- if(ec->valueProc) /* Call value proc for new value */
- /* (*ec->valueProc)(ec); */
- (*ec->valueProc)((easyControl)RecoverHandle((Ptr)ec));
- }
- lastP = p;
- }
- }
- if(ec->doneActionProc) /* Call doneAction proc once */
- (*ec->doneActionProc)(ec->value,ec->refcon);
-
- HUnlock(tempH);
- InitCursor();
- }
-
- void DrawSlider(easyControlPtr ec)
- /*
- * Draw the slider passed.
- */
- {
- register tSliderStyle *st;
- Rect r;
- Handle tempH;
-
- st = *(tSliderStyle **)ec->style;
- HLock(tempH = RecoverHandle((Ptr)st));
- r = ec->rect;
- /* r.right = r.left + st->sWidth;
- r.bottom = r.top + st->sHeight;*/
-
- if(ec->flags & easyControlActive)
- PenPat((Pattern *)dBlackPat);
- else
- PenPat((Pattern *)&dGrayPat);
-
- Fore555(ec->color[controlFrame]);
- PenSize(1,1);
- FrameRect(&r);
- InsetRect(&r,1,1);
- Fore555(ec->color[controlBackground]);
- PaintRect(&r);
-
- DrawSliderValue(ec);
- HUnlock(tempH);
- }
-
-
- void DrawSliderValue(easyControlPtr ec)
- {
- Rect bar,r;
- register tSliderStyle *st;
- long value;
- Boolean undefined;
-
- st = *(tSliderStyle **)ec->style; /* already locked by caller */
-
- value = ec->value;
- undefined = false;
- if(value == 0x7FFFffff)
- {
- value = ec->high;
- undefined = true;
- }
- else if(value < ec->low)
- value = ec->low;
- else if(value > ec->high)
- value = ec->high;
-
- bar.top = ec->rect.top + kBarVMargin;
- bar.bottom = ec->rect.top + st->sHeight - kBarVMargin;
- bar.left = ec->rect.left + 1;
- bar.right = ec->rect.left + 1 + (long)(value - ec->low) * (long)(st->sWidth - 2) /
- (long)(ec->high - ec->low);
-
- if(undefined)
- InsetRect(&bar,0,2);
-
- if(ec->flags & easyControlActive)
- PenPat((Pattern *)&dBlackPat);
- else
- PenPat((Pattern *)&dGrayPat);
-
- RaisedRect(&bar,ec->color[controlPart1]);
-
- bar.left = bar.right;
- bar.right = ec->rect.left + st->sWidth - 1;
- if(ec->variation & drawRightSlider)
- RaisedRect(&bar,ec->color[controlPart2]);
- else
- {
- Fore555(ec->color[controlBackground]);
- PaintRect(&bar);
- }
-
- if(st->tHeight) /* tHeight = 0 means no text */
- {
- r.left = ec->rect.left;
- r.top = ec->rect.top + st->sHeight - 1;
- r.right = r.left + st->tWidth;
- r.bottom = r.top + st->tHeight;
- Fore555(ec->color[controlFrame]);
- FrameRect(&r);
- InsetRect(&r,1,1);
- Fore555(ec->color[controlBackground]);
- PaintRect(&r);
- MoveTo(r.left + 2,r.bottom - (st->tHeight - 9)/2);
- Fore555(ec->color[controlFrame]);
- if(st->drawValue)
- (*st->drawValue)((easyControl)RecoverHandle((Ptr)ec));
- else
- {
- if(undefined)
- DrawString("\p----");
- else if(st->numberType == longNum)
- DrawNum(value);
- else if(st->numberType == fixedNum)
- DrawFixed(value,4);
- else if(st->numberType == fracNum)
- DrawFrac(value,8);
- else
- DrawString((StringPtr)"\pxyz");
- }
- }
- }
-
- void NewSlider(easyControlPtr ec)
- /*
- * Do allocations for a new easyControl slider type
- */
- {
- Handle h;
- register tSliderStyle *st;
-
- /*
- * Copy the style information to our very own handle
- */
- if(ec->style == 0)
- ec->style = &dDefaultSliderStyle;
- h = NewHandle(sizeof(tSliderStyle));
- BlockMove(ec->style,*h,sizeof(tSliderStyle));
- ec->style = h;
- st = (tSliderStyle *)*h;
- st->sWidth = ec->rect.right - ec->rect.left;
- st->sHeight = ec->rect.bottom - ec->rect.top;
-
- ec->low = 0;
- ec->high = 100;
- }
-
- void DisposeSlider(easyControlPtr ec)
- /*
- * Deallocate the slider
- */
- {
- DisposHandle((Handle)ec->style);
- }
-
- void SetSliderValue(struct easyControlRecord *ec,long value)
- {
- ec->value = value;
- }
-
- void HitTestSlider()
- {
- }
-
- void NewToggle(easyControlPtr ec)
- {
- ec->low = 0;
- ec->high = 1;
- }
-
- void DisposeToggle(easyControlPtr ec)
- {
- #pragma unused(ec)
- }
-
- void DrawToggle(easyControlPtr ec)
- {
- Rect r;
-
- r = ec->rect;
- Fore555(ec->color[0]);
- PenSize(1,1);
- FrameRect(&r);
- DrawToggleValue(ec);
- }
-
- void DrawToggleValue(easyControlPtr ec)
- {
- register tToggleStyle *st;
- Rect r;
- short c;
- PicHandle p;
-
- r = ec->rect;
- InsetRect(&r,1,1);
-
- if((ec->variation & checkboxToggle) && !(ec->flags & easyControlTracking)) /* checkbox version ? */
- {
- MaybeRaisedRect(ec->color[controlBackground],&r,ec->flags & easyControlBack);
- if(ec->value)
- {
- Fore555(ec->color[controlFrame]);
- PenSize(2,2);
- MoveTo(r.left,r.top);
- LineTo(r.right-2,r.bottom-2);
- MoveTo(r.left,r.bottom-2);
- LineTo(r.right-2,r.top);
- }
- }
- else
- {
- if((!ec->value) ^ (ec->variation & checkboxToggle != 0))
- c = ec->color[controlBackground];
- else
- c = ec->color[controlPart1];
-
- if(ec->flags & easyControlBack)
- {
- Fore555(c);
- PaintRect(&r);
- }
- else
- {
- RaisedRect(&r,c);
-
- st = ec->style;
- if(st && st->p) /* res ID zero doesn't draw */
- {
- p = (PicHandle)GetResource('PICT',st->p);
- if(p)
- {
- r = (**p).picFrame;
- OffsetRect(&r,((ec->rect.left + ec->rect.right) - (r.left + r.right))/2,
- ((ec->rect.top + ec->rect.bottom) - (r.top + r.bottom))/2);
- DrawPicture(p,&r);
- }
- else /* missing picture */
- {
- GoBlack();
- PenSize(1,1);
- MoveTo(ec->rect.left,ec->rect.top);
- LineTo(ec->rect.right-1,ec->rect.bottom-1);
- }
- }
- }
- }
- }
-
- void TrackToggle(register easyControlPtr ec,Point p,
- short *trackResult,short mods)
- {
- long oldValue,newValue;
- register Boolean inRect;
- long dummylong;
-
- #pragma unused(mods)
-
- oldValue = ec->value;
- newValue = !ec->value;
-
- if(ec->variation & dontTrackToggle)
- {
- ec->value = newValue;
- DrawToggleValue(ec);
- if(!(ec->variation & toggleToggle))
- Delay(5,&dummylong);
- inRect = true;
- }
- else
- do
- {
- SystemTask();
- GetMouse(&p);
- inRect = PtInRect(p,&ec->rect);
- if(inRect)
- newValue = !oldValue;
- else
- newValue = oldValue;
- if(newValue != ec->value)
- {
- ec->value = newValue;
- DrawToggleValue(ec);
- }
- } while(Button());
-
- if(!(ec->variation & toggleToggle) && (ec->value)) /* if it's not toggle-ish, reset it */
- {
- ec->value = 0;
- DrawToggleValue(ec);
- }
-
- *trackResult = inRect;
- }
-
- void SetToggleValue(easyControlPtr ec,long v)
- {
- ec->value = v;
- DrawToggleValue(ec);
- }
-
- void HitTestToggle(easyControlPtr ec,Point p)
- {
- #pragma unused(ec)
- #pragma unused(p)
- }
-
- void Idle(easyControlPtr ec, long *r)
- {
- if(*r & 1)
- Fore555(ec->color[1]);
- else
- Fore555(ec->color[0]);
-
- PenSize(1,1);
- FrameRect(&ec->rect);
- }
-
- void KeySlider(register easyControlPtr ec,short k,short m,register Boolean *tookKey)
- {
- register short step;
-
- *tookKey = true;
-
- if(m&shiftKey)
- step = 10;
- else
- step = 1;
- switch(k)
- {
- case 28:
- ec->value-=step;
- break;
- case 29:
- ec->value+=step;
- break;
- default:
- *tookKey = false;
- }
- DrawSliderValue(ec);
- }
-
- void KeyToggle(easyControlPtr ec,short k,short m,Boolean *tookKey)
- {
- #pragma unused (m)
-
- long dummylong;
-
- if(k == ' ') /* spacebar only */
- {
- *tookKey = true;
-
- if(ec->variation & toggleToggle)
- {
- ec->value = !ec->value;
- DrawToggleValue(ec);
- }
- else
- {
- ec->value = 1;
- DrawToggleValue(ec);
- Delay(5,&dummylong);
- ec->value = 0;
- DrawToggleValue(ec);
- }
-
- if(ec->valueProc)
- (*ec->valueProc)((easyControl)RecoverHandle((Ptr)ec));
- }
- else
- *tookKey = false;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- void NewBoolean(easyControlPtr ec)
- /*
- * Do allocations for a new easyControl Boolean type
- */
- {
- Handle h;
- register tSliderStyle *st;
-
- /*
- * Copy the style information to our very own handle
- */
- if(ec->style == 0)
- ec->style = &dDefaultSliderStyle;
- h = NewHandle(sizeof(tSliderStyle));
- BlockMove(ec->style,*h,sizeof(tSliderStyle));
- ec->style = h;
- st = (tSliderStyle *)*h;
- st->sWidth = ec->rect.right - ec->rect.left;
- st->sHeight = ec->rect.bottom - ec->rect.top;
-
- ec->low = 0;
- ec->high = 100;
- }
-
- void DisposeBoolean(easyControlPtr ec)
- /*
- * Deallocate the slider
- */
- {
- DisposHandle((Handle)ec->style);
- }
-
- void SetBooleanValue(struct easyControlRecord *ec,long value)
- {
- ec->value = value;
- }
-
- void HitTestBoolean()
- {
- }
-
- void DrawBoolean(easyControlPtr ec)
- /*
- * Draw the slider passed.
- */
- {
- register tSliderStyle *st;
- Rect r;
- Handle tempH;
- short bCount;
-
- bCount = 0;
-
- {
- long x;
-
- x = ec->high;
- while(x>>=1)
- bCount++;
- }
-
-
- st = *(tSliderStyle **)ec->style;
- HLock(tempH = RecoverHandle((Ptr)st));
- r = ec->rect;
-
-
- if(ec->flags & easyControlActive)
- PenPat((Pattern *)dBlackPat);
- else
- PenPat((Pattern *)&dGrayPat);
-
- Fore555(ec->color[controlFrame]);
- PenSize(1,1);
- FrameRect(&r);
- InsetRect(&r,1,1);
- Fore555(ec->color[controlBackground]);
- PaintRect(&r);
-
- DrawBooleanValue(ec);
- EraseRect(&r);
-
- HUnlock(tempH);
- }
-
-
-
-
-
- void DrawBooleanValue(easyControlPtr ec)
- {
- Rect bar,r;
- register tSliderStyle *st;
- long value;
- Boolean undefined;
-
- st = *(tSliderStyle **)ec->style; /* already locked by caller */
-
- value = ec->value;
- undefined = false;
- if(value == 0x7FFFffff)
- {
- value = ec->high;
- undefined = true;
- }
- else if(value < ec->low)
- value = ec->low;
- else if(value > ec->high)
- value = ec->high;
-
- bar.top = ec->rect.top + kBarVMargin;
- bar.bottom = ec->rect.top + st->sHeight - kBarVMargin;
- bar.left = ec->rect.left + 1;
- bar.right = ec->rect.left + 1 + (long)(value - ec->low) * (long)(st->sWidth - 2) /
- (long)(ec->high - ec->low);
-
- if(undefined)
- InsetRect(&bar,0,2);
-
- if(ec->flags & easyControlActive)
- PenPat((Pattern *)&dBlackPat);
- else
- PenPat((Pattern *)&dGrayPat);
-
- RaisedRect(&bar,ec->color[controlPart1]);
-
- bar.left = bar.right;
- bar.right = ec->rect.left + st->sWidth - 1;
- if(ec->variation & drawRightSlider)
- RaisedRect(&bar,ec->color[controlPart2]);
- else
- {
- Fore555(ec->color[controlBackground]);
- PaintRect(&bar);
- }
-
- if(st->tHeight) /* tHeight = 0 means no text */
- {
- r.left = ec->rect.left;
- r.top = ec->rect.top + st->sHeight - 1;
- r.right = r.left + st->tWidth;
- r.bottom = r.top + st->tHeight;
- Fore555(ec->color[controlFrame]);
- FrameRect(&r);
- InsetRect(&r,1,1);
- Fore555(ec->color[controlBackground]);
- PaintRect(&r);
- MoveTo(r.left + 2,r.bottom - (st->tHeight - 9)/2);
- Fore555(ec->color[controlFrame]);
- if(st->drawValue)
- (*st->drawValue)((easyControl)RecoverHandle((Ptr)ec));
- else
- {
- if(undefined)
- DrawString("\p----");
- else if(st->numberType == longNum)
- DrawNum(value);
- else if(st->numberType == fixedNum)
- DrawFixed(value,4);
- else if(st->numberType == fracNum)
- DrawFrac(value,8);
- else
- DrawString((StringPtr)"\pxyz");
- }
- }
- }
-
-
-
-
-
-
-
-
-
-
-
- void TrackBoolean(easyControlPtr ec,Point p)
- /*
- * Track the mouse within the slider as long
- * as the button is held down, all the while
- * updating the value and drawing the bar.
- */
- {
- tSliderStyle *st;
- Point lastP;
- long oldValue;
- long value;
- long vRange, rRange,rounding;
- double fVRange, fRRange, fRounding; /* for floating point sliders */
- Rect slopRect;
- long q;
- Boolean zingCursor;
- Handle tempH;
-
- GoCursor(kSliderCursor);
- zingCursor = true;
-
- st = *(tSliderStyle **)ec->style;
- HLock(tempH = RecoverHandle((Ptr)st));
- oldValue = ec->value;
-
- slopRect = ec->rect;
- InsetRect(&slopRect,-kSlop,-kSlop);
-
- if(st->numberType == floatNum)
- {
- fVRange = AsFloat(ec->high) - AsFloat(ec->low);
- fRRange = st->sWidth - 2;
- fRounding = (fRRange / fVRange) / 2;
- }
- else
- {
- vRange = ec->high - ec->low;
- rRange = st->sWidth - 2;
- rounding = (rRange / vRange) / 2;
- }
-
- if(ec->initActionProc) /* Call initAction proc once */
- (*ec->initActionProc)(ec->value,ec->refcon);
- while(Button())
- {
- q = TickCount()+2;
- while(TickCount() < q)
- SystemTask();
-
-
- if(ec->actionProc) /* Call action proc every time */
- (*ec->actionProc)(ec->value,ec->refcon);
-
- lastP.h = p.h+1; /* Guarantee do first time through */
- GetMouse(&p);
- if( (p.h != lastP.h) || (p.v != lastP.v) )
- {
- if(PtInRect(p,&slopRect))
- {
- if(!zingCursor)
- {
- GoCursor(kSliderCursor);
- zingCursor = true;
- }
- if(st->numberType == floatNum)
- ;
- else
- value = ec->low + (long)(p.h - ec->rect.left + rounding + 1) * vRange/rRange;
- }
- else
- {
- value = oldValue;
- if(zingCursor)
- {
- InitCursor();
- zingCursor = false;
- }
- }
-
- if(value < ec->low)
- value = ec->low;
- else if(value > ec->high)
- value = ec->high;
-
- if(value != ec->value)
- {
- ec->value = value;
- DrawSliderValue(ec);
-
- if(ec->valueProc) /* Call value proc for new value */
- /* (*ec->valueProc)(ec); */
- (*ec->valueProc)((easyControl)RecoverHandle((Ptr)ec));
- }
- lastP = p;
- }
- }
- if(ec->doneActionProc) /* Call doneAction proc once */
- (*ec->doneActionProc)(ec->value,ec->refcon);
-
- HUnlock(tempH);
- InitCursor();
- }
-
- void KeyBoolean(register easyControlPtr ec,short k,short m,register Boolean *tookKey)
- {
- register short step;
-
- *tookKey = true;
-
- if(m&shiftKey)
- step = 10;
- else
- step = 1;
- switch(k)
- {
- case 28:
- ec->value-=step;
- break;
- case 29:
- ec->value+=step;
- break;
- default:
- *tookKey = false;
- }
- DrawSliderValue(ec);
- }
-